package Chapter6;

//119页程序6.1修改版
//此处将Object类的equals方法重写，判断对象的内容是否相同。类似String类的equals，重写用来判断字符串内容是否相同
class BankAccount2{
    private String OwnerName;  //名称
    private int AccountNumber;  //账号
    private float Balance;  //余额

    BankAccount2(String name,int num1,float num2){ //构造方法
        OwnerName=name;
        AccountNumber=num1;
        Balance=num2;
    }

    String getOwnerName(){ //返回名字
        return OwnerName;
    }
    int getAccountNumber() { //返回账号
        return AccountNumber;
    }
    float getBalance() { //返回余额数
        return Balance;
    }

    //重写了Object类的equals方法，将不判断是否是同一对象，而是判断对象的内容是否相同
    public boolean equals(Object x){ //形式参数是object对象（是一个大的对象）
        if (this.getClass()!=x.getClass()) //this.getClass表示获取当前对象的类 x.getClass表示获取传参得到的对象的类 若类型不同，则没必要后续判断
            return false;
        BankAccount2 y=(BankAccount2) x; //x是父类Object的对象，不转成子类BankAccount的对象，是不能使用子类的属性和方法（大单位转小单位要强制转换）
        return ((this.getOwnerName().equals(y.getOwnerName()))) //获取当前对象的名字与强制转换的对象的名字，然后比较
                &&(this.getAccountNumber()==(y.getAccountNumber())) //获取当前对象的账号与强制转换的对象的账号，然后比较
                &&(this.getBalance()==(y.getBalance())); //获取当前对象的余额与强制转换的对象的余额，然后比较
    }
}

public class EqualsTest2 { //主类
    public static void main(String[] args) {
        BankAccount2 a=new BankAccount2("John",123,100.0f); //创建对象，调用的是顶级类Object创建对象，是大的对象
        BankAccount2 b=new BankAccount2("John",123,100.0f);
        //BankAccount b=a;  //当不使用new运算符时，a和b是同一个对象。如果使用new运算符，即使属性值相同，也不是同一个对象。

        if (a.equals(b)) //将父类Object的equals方法重写（覆盖）后，判断对象的属性值是否相同
            System.out.println("使用equals方法比较a和b的值是：值相同");
        else
            System.out.println("使用equals方法比较a和b的值是：值不同");
        if (a == b) //判断是否是同一对象
            System.out.println("使用==运算符比较a和b的结果是：是同一对象");
        else
            System.out.println("使用==运算符比较a和b的结果是：不是同一对象");
    }
}
